"""
定义处理主页数据统计的接口视图
"""
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework.viewsets import ViewSet
from django.utils import timezone
from users.models import User
from orders.models import OrderInfo
import pytz
from django.conf import settings
from datetime import timedelta
from rest_framework.decorators import action
from rest_framework.generics import ListAPIView
from goods.models import GoodsVisitCount
from meiduo_admin.serializers.home_serializers import *


from rest_framework.permissions import IsAuthenticated
class HomeViewSet(ViewSet):
    permission_classes = [IsAuthenticated]


    # 1、统计用户总数
    @action(methods=['get'], detail=False)
    def total_count(self, request):
        # 1、统计用户总数
        count = User.objects.count()

        # 获取当前时刻
        # 2020-1-16 5:50:30 <Shanghai>
        # 2020-1-15 21:50:30 <UTC>
        utc_cur_time = timezone.now()
        shanghai_cur_time = utc_cur_time.astimezone(
            pytz.timezone(settings.TIME_ZONE)
        )

        # 2、构建响应数据返回
        return Response({
            "count": count,
            "date": shanghai_cur_time.date()
        })

    # 2、日新增用户
    @action(methods=['get'], detail=False)
    def day_increment(self, request):
        # 1、获取"今日"的零时
        # 1.1 获取当前时刻的utc表现形式
        utc_cur_time = timezone.now()
        # 1.2 把utc的当前时刻转换成TIME_ZONE指明的时区的当前时刻
        # 2020-1-16 11：03：56 <Shanghai>
        shanghai_cur_time = utc_cur_time.astimezone(
            pytz.timezone(settings.TIME_ZONE)
        )
        # 1.3 TIME_ZONE指明的时区的零时
        # 2020-1-16 0:0:0 <Shanghai>
        local_0_time = shanghai_cur_time.replace(
            hour=0,
            minute=0,
            second=0
        )

        # 2、过滤出在"今日"新建的用户数量
        count = User.objects.filter(date_joined__gte=local_0_time).count()

        # 3、构建响应
        return Response({
            "count": count,
            "date": local_0_time.date()
        })

    # 3、日活跃用户
    @action(methods=['get'], detail=False)
    def day_active(self, request):
        # 1、获取"今日"的零时
        # 1.1 获取当前时刻的utc表现形式
        utc_cur_time = timezone.now()
        # 1.2 把utc的当前时刻转换成TIME_ZONE指明的时区的当前时刻
        # 2020-1-16 11：03：56 <Shanghai>
        shanghai_cur_time = utc_cur_time.astimezone(
            pytz.timezone(settings.TIME_ZONE)
        )
        # 1.3 TIME_ZONE指明的时区的零时
        # 2020-1-16 0:0:0 <Shanghai>
        local_0_time = shanghai_cur_time.replace(
            hour=0,
            minute=0,
            second=0
        )

        # 2、过滤出今天的活跃的用户数
        count = User.objects.filter(last_login__gte=local_0_time).count()
        # 3、构建响应
        return Response({
            "count": count,
            "date": local_0_time.date()
        })

    # 4、日下单用户
    @action(methods=['get'], detail=False)
    def day_orders(self, request):

        # 统计"当日下了订单的"用户数量
        # 已知条件：当日的零时  -->  从表
        # 目标数据：用户数据    -->  主表

        utc_cur_time = timezone.now()
        shanghai_cur_time = utc_cur_time.astimezone(
            pytz.timezone(settings.TIME_ZONE)
        )
        local_0_time = shanghai_cur_time.replace(
            hour=0,
            minute=0,
            second=0
        )

        # 方案一： 从表入手
        # 所有订单对象(查询集)
        # orders = OrderInfo.objects.filter(create_time__gte=local_0_time)
        # user_set = set()
        # for order in orders:
        #     # order: 单一的订单对象
        #     user_set.add(order.user)
        # count = len(user_set)
        #
        # return Response({
        #     "count": count,
        #     "date": local_0_time.date()
        # })


        # 方案二：主表入手
        user_queryset = User.objects.filter(
            orders__create_time__gte=local_0_time
        )
        count = len(set(user_queryset))

        return Response({
            "count": count,
            "date": local_0_time.date()
        })




    # 5、月新增用户
    @action(methods=['get'], detail=False)
    def month_increment(self, request):

        # 统计最近30天(包括今天在内的)，每一天新增用户数量
        # 2020-1-1 0:0:0 <= date_joined < 2020-1-2 0:0:0
        # 2020-1-2 0:0:0 <= date_joined < 2020-1-3 0:0:0
        # 2020-1-3 0:0:0 <= date_joined < 2020-1-4 0:0:0
        # ....
        # 2020-1-16 0:0:0 <= date_joined < 2020-1-17 0:0:0


        utc_cur_time = timezone.now()
        shanghai_cur_time = utc_cur_time.astimezone(
            pytz.timezone(settings.TIME_ZONE)
        )
        # 1、最近30天，最后一天的零时
        end_0_time = shanghai_cur_time.replace(
            hour=0,
            minute=0,
            second=0
        )
        # 2、启始时间点 = 结尾时间点 - (统计天数 - 1)
        start_0_time = end_0_time - timedelta(days=29)


        # 3、统计最近30日，每一天的新增用户
        return_list = []
        for index in range(30):
            # calc_0_time = start_0_time + timedelta(days=0) # 第1天  index=0
            # calc_0_time = start_0_time + timedelta(days=1) # 第2天  index=1
            # calc_0_time = start_0_time + timedelta(days=2) # 第3天  index=2
            # calc_0_time = start_0_time + timedelta(days=3) # 第4天  index=3
            # ....
            calc_0_time = start_0_time + timedelta(days=index) # 第index天
            # calc_0_time: 代表最近30天中某一天的零时
            count = User.objects.filter(
                date_joined__gte=calc_0_time,
                date_joined__lt=calc_0_time + timedelta(days=1)
            ).count()

            return_list.append({
                "count": count,
                'date': calc_0_time.date()
            })

        return Response(return_list)

# 序列化返回"当日"商品访问量
class GoodsDayVisitView(ListAPIView):
    queryset = GoodsVisitCount.objects.all()
    # 定义一个序列化器对GoodsVisitCount模型类序列化成
    # category和count两个字段
    serializer_class = GoodsVisitModelSerializer


    # 如何在一个ListAPIView视图序列化返回的逻辑中添加过滤操作
    # 重写self.get_queryset()就可以了
    def get_queryset(self):
        # 该函数返回的数据集就是后续序列化操作使用的数据集
        # 实现简单的过滤
        # 返回"当日"新建的记录商品访问的信息
        cur_time = timezone.now()
        cur_shanghai_time = cur_time.astimezone(tz=pytz.timezone(settings.TIME_ZONE))

        # "当日"的零时刻
        local_0_time = cur_shanghai_time.replace(
            hour=0,
            minute=0,
            second=0
        )

        # 当日记录的商品访问量查询集
        return self.queryset.filter(
            create_time__gte=local_0_time
        )








